/*
 * Copyright 2009 IT Mill Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.pcorp;

import com.vaadin.Application;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Form;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.SplitPanel;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

/**
 * The Application's "main" class
 */
@SuppressWarnings("serial")
public class MyVaadinApplication extends Application
{
	private Window window;
	private static String[] fields = { "First Name", "Last Name", "Company",
		"Mobile Phone", "Work Phone", "Home Phone", "Work Email",
		"Home Email", "Street", "Zip", "City", "State", "Country" };
	private static String[] visibleCols = new String[] { "Last Name",
		"First Name", "Company" };

	private Table contactList = new Table();
	private Form contactEditor = new Form();
	private HorizontalLayout bottomLeftCorner = new HorizontalLayout();
	private Button contactRemovalButton;
	private IndexedContainer addressBookData = createDummyData();

	@Override
	public void init() {
		initLayout();
		initContactAddRemoveButtons();
		initAddressList();
		initFilteringControls();
	}

	private void initLayout() {
		SplitPanel splitPanel = new SplitPanel(
						SplitPanel.ORIENTATION_HORIZONTAL);
		setMainWindow(new Window("Address Book", splitPanel));
		VerticalLayout left = new VerticalLayout();
		left.setSizeFull();
		left.addComponent(contactList);
		contactList.setSizeFull();
		left.setExpandRatio(contactList, 1);
		splitPanel.addComponent(left);
		splitPanel.addComponent(contactEditor);
		contactEditor.setCaption("Contact details editor");
		contactEditor.setSizeFull();
		contactEditor.getLayout().setMargin(true);
		contactEditor.setImmediate(true);
		bottomLeftCorner.setWidth("100%");
		left.addComponent(bottomLeftCorner);
	}

	private void initContactAddRemoveButtons() {
		// New item button
		bottomLeftCorner.addComponent(new Button("+",
						new Button.ClickListener() {
			public void buttonClick(ClickEvent event) {
				// Add new contact "John Doe" as the first item
				Object id = ((IndexedContainer) contactList
								.getContainerDataSource()).addItemAt(0);
				contactList.getItem(id).getItemProperty("First Name")
				.setValue("John");
				contactList.getItem(id).getItemProperty("Last Name")
				.setValue("Doe");

				// Select the newly added item and scroll to the item
				contactList.setValue(id);
				contactList.setCurrentPageFirstItemId(id);
			}
		}));

		// Remove item button
		contactRemovalButton = new Button("-", new Button.ClickListener() {
			public void buttonClick(ClickEvent event) {
				contactList.removeItem(contactList.getValue());
				contactList.select(null);
			}
		});
		contactRemovalButton.setVisible(false);
		bottomLeftCorner.addComponent(contactRemovalButton);
	}

	private String[] initAddressList() {
		contactList.setContainerDataSource(addressBookData);
		contactList.setVisibleColumns(visibleCols);
		contactList.setSelectable(true);
		contactList.setImmediate(true);
		contactList.addListener(new Property.ValueChangeListener() {
			public void valueChange(ValueChangeEvent event) {
				Object id = contactList.getValue();
				contactEditor.setItemDataSource(id == null ? null : contactList
								.getItem(id));
				contactRemovalButton.setVisible(id != null);
			}
		});
		return visibleCols;
	}

	private void initFilteringControls() {
		for (final String pn : visibleCols) {
			final TextField sf = new TextField();
			bottomLeftCorner.addComponent(sf);
			sf.setWidth("100%");
			sf.setInputPrompt(pn);
			sf.setImmediate(true);
			bottomLeftCorner.setExpandRatio(sf, 1);
			sf.addListener(new Property.ValueChangeListener() {
				public void valueChange(ValueChangeEvent event) {
					addressBookData.removeContainerFilters(pn);
					if (sf.toString().length() > 0 && !pn.equals(sf.toString())) {
						addressBookData.addContainerFilter(pn, sf.toString(),
										true, false);
					}
					getMainWindow().showNotification(
									"" + addressBookData.size() + " matches found");
				}
			});
		}
	}

	private static IndexedContainer createDummyData() {

		String[] fnames = { "Peter", "Alice", "Joshua", "Mike", "Olivia",
						"Nina", "Alex", "Rita", "Dan", "Umberto", "Henrik", "Rene",
						"Lisa", "Marge" };
		String[] lnames = { "Smith", "Gordon", "Simpson", "Brown", "Clavel",
						"Simons", "Verne", "Scott", "Allison", "Gates", "Rowling",
						"Barks", "Ross", "Schneider", "Tate" };

		IndexedContainer ic = new IndexedContainer();

		for (String p : fields) {
			ic.addContainerProperty(p, String.class, "");
		}

		// Create dummy data by randomly combining first and last names
		for (int i = 0; i < 1000; i++) {
			Object id = ic.addItem();
			ic.getContainerProperty(id, "First Name").setValue(
							fnames[(int) (fnames.length * Math.random())]);
			ic.getContainerProperty(id, "Last Name").setValue(
							lnames[(int) (lnames.length * Math.random())]);
		}

		return ic;
	}

}


